/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sistematesis;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *
 * @author Administrador
 */
public class PyRT {
   
    public static int ContRT1S=0;
    public static int ContRT2S=0;
    public static int ContRT3SAlt=0;
    public static ArrayList RetirosTemporales;
    public static ArrayList Ruts;
    public static int ContRutsRetirados;
    public static ArrayList Retencion;
    public static ArrayList TasaTitulacion;
    public static ArrayList Promociones;

    public static ArrayList perdidaPorAusentismo(String rutaFuente,Double DesdeParam, Double HastaParam) throws IOException{
      
      RetirosTemporales= new ArrayList();
      RetirosTemporales.add(0,(int)0);//ingresa un entero 0 para inicializar cantidad de retiros por un semestre
      RetirosTemporales.add(1,(int)0);//ingresa un entero 0 para inicializar cantidad de retiros por dos semestres conscutivos
      RetirosTemporales.add(2,(int)0);//ingresa un entero 0 para inicializar cantidad de retiros por tres semestre alternativos
      Ruts = Eliminacion.RutsEnPeriodo(rutaFuente, DesdeParam, HastaParam);
      ContRutsRetirados=0;
//       System.out.println("por ausentismo");
      for(int i=0; i<Ruts.size();i++){//recorre por ruts

          ArrayList DatosRutEspecifico= Eliminacion.LlenaArregloConRutEspecifico(Ruts.get(i).toString().replace(" ", "").trim(), rutaFuente, DesdeParam, HastaParam);
          ArrayList Ordenados= new ArrayList();

           for(int z=0;z<DatosRutEspecifico.size();z++){//llena arreglo "ORDENADO"

                String aux= ((ArrayList)DatosRutEspecifico.get(z)).get(2).toString().replace(" ", "").trim();
                String año= aux.substring(0,4);
                String Semestre= aux.substring(5);
                Double AñoSemestre = Double.valueOf(año);
                if(Semestre.equals("2"))AñoSemestre=AñoSemestre+0.5;
                if(Ordenados.isEmpty()){
                    Ordenados.add(AñoSemestre);
                }else{
                    if(!Ordenados.contains(AñoSemestre)){
                        Ordenados.add(AñoSemestre);
                    }
                }

          }
          Collections.sort(Ordenados);

          int f=0,s=0;
          ArrayList Resultados = new ArrayList();
          for(f=0;f<Ordenados.size()-1;f++){
              if(Ordenados.get(f+1)!=null){
                Double R=Double.valueOf(Ordenados.get(f).toString().replace(" ", "").trim())-Double.valueOf(Ordenados.get(f+1).toString().replace(" ", "").trim());
                Resultados.add(R);
              }
          }
          if(!Ordenados.get(0).toString().equals(DesdeParam.toString())){
                Double Aux = DesdeParam-0.5;
                Resultados.add(Aux-Double.valueOf(Ordenados.get(0).toString().replace(" ", "").trim()));

          }
          if(!Ordenados.get(Ordenados.size()-1).toString().equals(HastaParam.toString())){
                Double aux1=HastaParam+0.5;
                Resultados.add(Double.valueOf(Ordenados.get(Ordenados.size()-1).toString().replace(" ", "").trim())-aux1);
                
          }


          ContRT1S=0;ContRT2S=0;ContRT3SAlt=0;
          //Recorremos los resultados
          for(s=0; s< Resultados.size();s++){

                if(Double.valueOf(Resultados.get(s).toString().replace(" ","").trim())==-1.0){
                    ContRT1S++;
                }
                if(Double.valueOf(Resultados.get(s).toString().replace(" ","").trim())==-1.5){
                    ContRT2S++;
                }
                if((ContRT1S/3)>=1){
                    ContRT3SAlt=ContRT1S/3;
                }
          }
          if(ContRT1S!=0||ContRT2S!=0||ContRT3SAlt!=0){
             ContRutsRetirados++;
          }
//            System.out.println(Ruts.get(i)+"  "+ContRT1S+"  "+ContRT2S+" "+ContRT3SAlt +"-------RESULTADOS"+Resultados+"sdfsdf"+Ordenados);
         //Llena Arreglo con Resultados
          RetirosTemporales.set(0,Integer.parseInt(RetirosTemporales.get(0).toString())+ContRT1S);
          RetirosTemporales.set(1,Integer.parseInt(RetirosTemporales.get(1).toString())+ContRT2S);
          RetirosTemporales.set(2,Integer.parseInt(RetirosTemporales.get(2).toString())+ContRT3SAlt);

     }
//     System.out.println("Retiros Temporales");
//     System.out.println(RetirosTemporales);
     return RetirosTemporales;
  }

    public static ArrayList Retencion(String rutaFuente,Double DesdeParam, Double HastaParam,String Regimen,int CantPeriodosPlan) throws IOException{
        Retencion = new ArrayList();
        ArrayList PeriodosyRetencion = new ArrayList();
        PeriodosyRetencion.add(new ArrayList());
       ((ArrayList)PeriodosyRetencion.get(0)).add(0,DesdeParam);
       ((ArrayList)PeriodosyRetencion.get(0)).add(1,(int)0);//Cantidad de Inscritos
       ((ArrayList)PeriodosyRetencion.get(0)).add(2,(int)0);//Cantidad de Alumnos de Primer Año
     

        Double DesdeAux=DesdeParam;
        int CantPeriodos=0;
            CantPeriodos=(int) (HastaParam-DesdeParam);
            if(Regimen.equals("Semestral"))// consulta si es semestral
                CantPeriodos=CantPeriodos*2+1;
        //Llena Arrelgo con periodos involucrados.
            for(int i=1;i<CantPeriodos;i++){
                PeriodosyRetencion.add(new ArrayList());
                if(Regimen.equals("Semestral")){// consulta si es semestral
                ((ArrayList)PeriodosyRetencion.get(i)).add(0,DesdeAux+0.5);//AñoCursado
                ((ArrayList)PeriodosyRetencion.get(i)).add(1,(int)0);//Cantidad de Inscritos
                ((ArrayList)PeriodosyRetencion.get(i)).add(2,(int)0);//Cantidad de Alumnos de Primer Año
                DesdeAux=DesdeAux+0.5;
                }
                if(Regimen.equals("Anual")){// consulta si es semestral
                ((ArrayList)PeriodosyRetencion.get(i)).add(0,DesdeAux+1);
                ((ArrayList)PeriodosyRetencion.get(i)).add(1,(int)0);//Cantidad de Inscritos
                ((ArrayList)PeriodosyRetencion.get(i)).add(2,(int)0);//Cantidad de Alumnos de Primer Año
                 DesdeAux=DesdeAux+1;
                }
            }
         //fin llena arreglo con periodos
         //Obtiene Cantidad de Inscritos por periodo recorriendo excel (ASIGNATURAS INSCRITAS)
         for(int h=0; h<PeriodosyRetencion.size();h++){
              Double Periodo = Double.parseDouble(((ArrayList)PeriodosyRetencion.get(h)).get(0).toString().replace(" ", ""));
             ((ArrayList)PeriodosyRetencion.get(h)).set(1,Eliminacion.RutsEnPeriodo(rutaFuente, Periodo, Periodo).size());//suma uno a la cantidad de inscritos en ese periodo
//              Double Periodo2 = Double.parseDouble(((ArrayList)PeriodosyRetencion.get(i)).get(0).toString().replace(" ", ""));
             ((ArrayList)PeriodosyRetencion.get(h)).set(2,Eliminacion.RutsEnPeriodoPrimerAño(rutaFuente, Periodo, Periodo).size());//suma uno a la cantidad de inscritos en ese periodo
         }
      //Análisis

      //veridica si primer año en que se dicta el plan corresponde al princio del arreglo
//      if(((ArrayList)PeriodosyRetencion.get(0)).get(1).toString().replace(" ", "").equals(((ArrayList)PeriodosyRetencion.get(0)).get(2).toString().replace(" ", ""))){
//      ((ArrayList)PeriodosyRetencion.get(0)).set(2,(int)0);
//      }
      //Agrega valor sin alumnos de primer año a arreglo (resta posicion 1 y 2)
      for(int z=0;z<PeriodosyRetencion.size();z++){
          int Diferencia = Integer.parseInt(((ArrayList)PeriodosyRetencion.get(z)).get(1).toString())-Integer.parseInt(((ArrayList)PeriodosyRetencion.get(z)).get(2).toString());
          ((ArrayList)PeriodosyRetencion.get(z)).add(3,Diferencia);

      }
      //Cuantifica la tasa de retencion
      for(int t=0;t<PeriodosyRetencion.size();t++){
          if(t==0){
             ((ArrayList)PeriodosyRetencion.get(t)).add(4,(int)0);
          }else{
          int TasaRetencion = ((Integer.parseInt(((ArrayList)PeriodosyRetencion.get(t)).get(3).toString()))*100)/Integer.parseInt(((ArrayList)PeriodosyRetencion.get(t-1)).get(1).toString());
          ((ArrayList)PeriodosyRetencion.get(t)).add(4,TasaRetencion);
          }
      }
//        System.out.println("Remnción");
//        System.out.println(PeriodosyRetencion);
        Retencion=PeriodosyRetencion;
        return Retencion;

    }

    public static ArrayList TasaTitulacion(String rutaFuente,Double DesdeParam, Double HastaParam,String Regimen,int CantPeriodosPlan, int TotalCreditosPlan) throws IOException{
   Promociones = new ArrayList();
   TasaTitulacion = new ArrayList();
    ArrayList NoSeCalcula=new ArrayList();//Bandera para saber si se calcula el valor.
    Double DesdeAux = DesdeParam;
    int CantPeriodos=0;
            CantPeriodos=(int) (HastaParam-DesdeParam);
            if(Regimen.equals("Semestral"))// consulta si es semestral
                CantPeriodos=CantPeriodos*2+1;

    if(!(CantPeriodosPlan<CantPeriodos)){
//        System.out.println(CantPeriodosPlan +"----"+CantPeriodos);
        JOptionPane.showMessageDialog(null,"No es posible calcular Tasas de Titulación\n La cantidad de periodos no permite realizar el Cálculo\n Por favor revise los parámetros ingresados");
        return NoSeCalcula;

    }
    int PromocionesContenidas= (CantPeriodos-CantPeriodosPlan+1)/2;
     Promociones.add(new ArrayList());
     //llena primera posicion de promocion contenida en periodo
    ((ArrayList)Promociones.get(0)).add(0,DesdeAux);//AñoCursado
      if(Regimen.equals("Semestral")){// consulta si es semestral
                ((ArrayList)Promociones.get(0)).add(1,DesdeAux+((CantPeriodosPlan/2)-0.5));//Periodo Término
                 DesdeAux=DesdeAux+1;
                }
                if(Regimen.equals("Anual")){// consulta si es semestral
                 ((ArrayList)Promociones.get(0)).add(1,DesdeAux+((CantPeriodosPlan/2)-1));//Periodo Termino
                  DesdeAux=DesdeAux+1;
                }
//    System.out.println(PromocionesContenidas);
     //completa promociones contenidas en periodo
    for(int i=1;i<PromocionesContenidas;i++){
                if(Regimen.equals("Semestral")){// consulta si es semestral
                Promociones.add(new ArrayList());
                ((ArrayList)Promociones.get(i)).add(0,DesdeAux);//Periodo Ingreso
                ((ArrayList)Promociones.get(i)).add(1,DesdeAux+((CantPeriodosPlan/2)-0.5));//Periodo Término
                DesdeAux=DesdeAux+1;
                }
                if(Regimen.equals("Anual")){// consulta si es semestral
                Promociones.add(new ArrayList());
                ((ArrayList)Promociones.get(i)).add(0,DesdeAux);//Periodo Ingreso
                ((ArrayList)Promociones.get(i)).add(1,DesdeAux+((CantPeriodosPlan/2)-1));//Periodo Término
                DesdeAux=DesdeAux+1;
                }
            }
    //fin completa promociones contenidas en periodo
    int v=0;
//    System.out.println(Promociones);
    for(int i=0; i<Promociones.size();i++){
//        System.out.println(((ArrayList)Promociones.get(i)).get(0).toString().replace(" ", "").trim());
        ArrayList RutsTituladosEnPromocion= BuscaRut( ((ArrayList)Promociones.get(i)).get(0).toString().replace(" ", "").trim(), rutaFuente, DesdeParam, HastaParam, TotalCreditosPlan);
        //Analiza Tasa Titulacion
        Double Periodo= Double.valueOf(((ArrayList)Promociones.get(i)).get(0).toString().replace(" ", "").trim());
        int TotalInsPromo = Eliminacion.RutsEnPeriodoPrimerAño(rutaFuente, Periodo, Periodo).size();
        
        for(int k=0; k<RutsTituladosEnPromocion.size();k++){
   
            if(Eliminacion.busca(TasaTitulacion,((ArrayList)RutsTituladosEnPromocion.get(k)).get(3).toString().replace(" ","").trim())){//busca la promocion
                if(buscaTitulacion(TasaTitulacion,((ArrayList)RutsTituladosEnPromocion.get(k)).get(2).toString().replace(" ","").trim(),((ArrayList)RutsTituladosEnPromocion.get(k)).get(3).toString().replace(" ","").trim())){//busca añoEgreso para Promocion
                        int fila =  posicionTitulacion(TasaTitulacion,((ArrayList)RutsTituladosEnPromocion.get(k)).get(2).toString().replace(" ","").trim(),((ArrayList)RutsTituladosEnPromocion.get(k)).get(3).toString().replace(" ","").trim());
                        int aux = Integer.parseInt(((ArrayList)TasaTitulacion.get(fila)).get(2).toString().replace(" ", "").trim());
                        aux= aux+1;
                        ((ArrayList)TasaTitulacion.get(fila)).set(2, aux);//agrega +1 al contador de titulados en ese periodo para esa promocion
                        ((ArrayList)TasaTitulacion.get(fila)).set(3,(Integer.parseInt(((ArrayList)TasaTitulacion.get(fila)).get(2).toString().replace(" ","").trim())*100)/TotalInsPromo);//actualiza la tasa de titulación
                }else{
                        TasaTitulacion.add(new ArrayList());
                        ((ArrayList)TasaTitulacion.get(v)).add(((ArrayList)RutsTituladosEnPromocion.get(k)).get(3).toString().replace(" ","").trim());
                        ((ArrayList)TasaTitulacion.get(v)).add(((ArrayList)RutsTituladosEnPromocion.get(k)).get(2).toString().replace(" ","").trim());
                        ((ArrayList)TasaTitulacion.get(v)).add((int)1);
                        ((ArrayList)TasaTitulacion.get(v)).add((Integer.parseInt(((ArrayList)TasaTitulacion.get(v)).get(2).toString().replace(" ","").trim())*100)/TotalInsPromo);
                        v++;
                }
           }else{
               TasaTitulacion.add(new ArrayList());
               ((ArrayList)TasaTitulacion.get(v)).add(((ArrayList)RutsTituladosEnPromocion.get(k)).get(3).toString().replace(" ","").trim());
               ((ArrayList)TasaTitulacion.get(v)).add(((ArrayList)RutsTituladosEnPromocion.get(k)).get(2).toString().replace(" ","").trim());
               ((ArrayList)TasaTitulacion.get(v)).add((int)1);
               ((ArrayList)TasaTitulacion.get(v)).add((Integer.parseInt(((ArrayList)TasaTitulacion.get(v)).get(2).toString().replace(" ","").trim())*100)/TotalInsPromo);
               v++;
           }

        }

    }
//    System.out.println("Tasa Titulación");
//    System.out.println(TasaTitulacion);
    return TasaTitulacion;
}


    public static ArrayList PromocionesContenidas(){
//        System.out.println(Promociones);
        return Promociones;
    }

    public static Double DuracionCarrera(String Regimen){
    
    Double Duracion =0.0;
    for(int i=0 ; i<TasaTitulacion.size();i++){
     Double Ingreso=Double.valueOf(((ArrayList)TasaTitulacion.get(i)).get(0).toString().replace(" ","").trim());
     Double Egreso=Double.valueOf(((ArrayList)TasaTitulacion.get(i)).get(1).toString().replace(" ","").trim());
     Double CantPeriodos=0.0;
            CantPeriodos=(Egreso-Ingreso);
            if(Regimen.equals("Semestral"))// consulta si es semestral
                CantPeriodos=CantPeriodos*2+1;
            Duracion=Duracion+CantPeriodos;
    }
    Double TotalDuracion= (Duracion/TasaTitulacion.size())/2;
//    System.out.println("Duracion Carrera");
//    System.out.println(TotalDuracion);
    return TotalDuracion;
}

    public static ArrayList BuscaRut(String AñoIngreso,String rutaFuente,Double DesdeParam, Double HastaParam, int TotalCreditosPlan) throws IOException{

      ArrayList RutsPromocion= new ArrayList();
      ArrayList RutsTituladosPromocion= new ArrayList();
      Double Desde=DesdeParam;
      Double Hasta=HastaParam;
        HSSFWorkbook libro = new HSSFWorkbook(new FileInputStream(rutaFuente));
        HSSFSheet hoja = libro.getSheet(libro.getSheetName(0));
        HSSFRow row = null;
        HSSFCell cell = null;
        Double UltimoAño=0.0;
        int AñoSemestre=2;
        int u=0;
        /* RECORRE DOCUMENTO*/
        for ( int i=1, z=hoja.getLastRowNum(); i<=z; i++ )
        {

           row = hoja.getRow(i);
           if (row != null) {
                cell = row.getCell((int) AñoSemestre);
             if (cell != null)
                {
                /*Obtiene AñoSemestre de la celda*/
                String StrAux=new String();
                StrAux= cell.getStringCellValue().trim();//obtiene valor de celda como String y elimina espacios con "trim"
                StrAux=StrAux.replace(" ", "");//Elimina Espacios Internos
                Double Periodo=Double.parseDouble(StrAux.substring(0,4));//separa el año desde el String y lo convierte en double

                if(StrAux.substring(5).equals("2")){//si el periodo corresponde al segundo semestre agrega 0.5 al año almacenado en Periodo
                Periodo=Periodo+0.5;//Periodo continene el año Extraido como Double.
                    }
                 /*Obtiene AñoIngreso de la celda*/
                String StrAux1=new String();
                StrAux1= row.getCell(3).toString().replace(" ", "").trim();//obtiene valor de celda como String y elimina espacios con "trim"
                Double Ingreso=Double.parseDouble(StrAux1.substring(0,4));//separa el año desde el String y lo convierte en double
                if(StrAux1.substring(5).equals("2")){//si el periodo corresponde al segundo semestre agrega 0.5 al año almacenado en Periodo
                Ingreso=Ingreso+0.5;//Periodo continene el año Extraido como Double.
                    }
                /*FIN OBTENCION AÑOSEMESTRE*/
                         if(Desde<=Periodo && Periodo<=Hasta)
                         {

                           if(Ingreso.toString().equals(AñoIngreso))// Verifica que celda alumno reprobado.
                                {
                              
                               if(Eliminacion.busca(RutsPromocion,row.getCell(0).toString().replace(" ", "").trim())){

                                 if(row.getCell(8).toString().replace(" ","").trim().equals("APR")){ // si está aprobado suma la cantidad de creditos.
                                           int fila = Eliminacion.Pocision(RutsPromocion, row.getCell(0).toString().replace(" ", "").trim()); // captura fila
                                           Double aux = Double.valueOf(((ArrayList)RutsPromocion.get(fila)).get(1).toString().replace(" ","").trim());
                                           aux= aux + Double.valueOf(row.getCell(9).toString().replace(" ", "").trim());
                                           ((ArrayList)RutsPromocion.get(fila)).set(1,aux.intValue());
                                            if(UltimoAño<EnDouble(row.getCell(2).toString().replace(" ", "").trim())){//Obtiene el ultimo año cursado por el alumno
                                                UltimoAño=EnDouble(row.getCell(2).toString().replace(" ", "").trim());
                                                ((ArrayList)RutsPromocion.get(fila)).set(2,UltimoAño);
                                                }
                                        }


                               }else{
                                    RutsPromocion.add(new ArrayList());
                                    ((ArrayList)RutsPromocion.get(u)).add(row.getCell(0).toString().replace(" ", "").trim());//captura rut pretenecinete a la promocion
                                    
                                        if(row.getCell(8).toString().replace(" ","").trim().equals("APR")){ // si está aprobado suma la cantidad de creditos.
                                            ((ArrayList)RutsPromocion.get(u)).add(1,Double.valueOf(row.getCell(9).toString().replace(" ", "").trim()));
                                          
                                            ((ArrayList)RutsPromocion.get(u)).add(2,UltimoAño);
                                        }else{
                                            ((ArrayList)RutsPromocion.get(u)).add(1,0.0); // ingresa por primera vez una cantidad de creditos aprobados
                                            ((ArrayList)RutsPromocion.get(u)).add(2,UltimoAño);
                                        }
                                    ((ArrayList)RutsPromocion.get(u)).add(EnDouble(row.getCell(3).toString().replace(" ", "").trim()));// Año Ingreso
                                    u++;
                               }
                               
                        }
                    }
                }
            }
        }
  
        for(int t=0 ; t<RutsPromocion.size(); t++){
            if(((ArrayList)RutsPromocion.get(t)).get(1).toString().replace(" ", "").trim().equals(String.valueOf(TotalCreditosPlan).replace(" ",""))){
                RutsTituladosPromocion.add(RutsPromocion.get(t));

            }
        }
    
    return RutsTituladosPromocion;
}

    private static Double EnDouble(String Año){
    Double AñoDouble=Double.parseDouble(Año.substring(0,4));//separa el año desde el String y lo convierte en double
    if(Año.substring(5).equals("2")){//si el periodo corresponde al segundo semestre agrega 0.5 al año almacenado en Periodo
        AñoDouble=AñoDouble+0.5;//Periodo continene el año Extraido como Double.
      }
    return AñoDouble;
    }

    private static boolean buscaTitulacion(ArrayList Arreglo, String añoEgreso,String añoIngreso) {
//        System.out.println(Arreglo);
        for(int i=0; i<Arreglo.size()&& !Arreglo.isEmpty();i++){
            String auxIngreso =((ArrayList)Arreglo.get(i)).get(0).toString().replace(" ", "").trim();
            String auxEgreso  =((ArrayList)Arreglo.get(i)).get(1).toString().replace(" ", "").trim();
            if (auxIngreso.equals(añoIngreso)&& auxEgreso.equals(añoEgreso)){
                return true;
            }
        }
        return false;

    }

    private static int posicionTitulacion(ArrayList Arreglo, String añoEgreso, String añoIngreso) {
          for(int i=0; i<Arreglo.size()&&!Arreglo.isEmpty();i++){
            String auxIngreso =(((ArrayList)Arreglo.get(i)).get(0)).toString().replace(" ", "").trim();
            String auxEgreso =(((ArrayList)Arreglo.get(i)).get(1)).toString().replace(" ", "").trim();
            if (auxIngreso.equals(añoIngreso)&& auxEgreso.equals(añoEgreso)){
                return i;
            }
          }
        return -1;
    }


}
